﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Foundation;
using System.ServiceModel;

namespace DataHandler {
    [ServiceContract]
    public interface IDataHandler {

        /// <summary>
        /// Speicher eine SoundSuite in der Datenbank
        /// </summary>
        /// <param name="suite">Die SoundSuite, welche gespeichert werden soll</param>
        [OperationContract]
        void SaveSoundSuite(SoundSuite suite);

        /// <summary>
        /// Lädt eine SoundSuite anhand einer ID
        /// </summary>
        /// <param name="id">Die ID der SoundSuite, welche geladen werden soll</param>
        /// <returns>Die geladene Sound Suite oder null, wenn keine SoundSuite mit der entsprechenden ID besteht</returns>
        [OperationContract]
        SoundSuite LoadSoundSuite(Guid id);

        /// <summary>
        /// Gibt eine Liste mit allen in der Datenbank vorhandenen SoundSuites zurück
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        List<SoundSuite> ShowSoundSuites();

        /// <summary>
        /// Diese Methode löschte eine SoundSuite mit all den dazugeörigen Daten aus der Datenbank
        /// </summary>
        /// <param name="id"></param>
        [OperationContract]
        void DeleteSoundSuite(Guid id); 


        /// <summary>
        /// Lädt eine EffectGroup anhand einer ID
        /// </summary>
        /// <param name="id">Die ID der Effect Group, welche geladen werden soll</param>
        /// <returns>Die geladenen Effect Group oder null</returns>
        [OperationContract]
        EffectGroup LoadEffectGroup(Guid id);

        /// <summary>
        /// Speichert eine Effect Group
        /// </summary>
        /// <param name="group">Group welche gespeichert werden soll</param>
        [OperationContract]
        void SaveEffectGroup(EffectGroup group);

        /// <summary>
        /// lädt einen Effect anhand einer ID
        /// </summary>
        /// <param name="id">ID des zu ladenden Effects</param>
        /// <returns>Der geladene Effect</returns>
        [OperationContract]
        Effect LoadEffect(Guid id);

        /// <summary>
        /// Schreibt einen Effect auf die Datenbank
        /// </summary>
        /// <param name="effect">Der zu schreibende Effect</param>
        [OperationContract]
        void SaveEffect(Effect effect);

        /// <summary>
        /// Schreibt eine Liste mit Track Objekten in die Datenbank
        /// </summary>
        /// <param name="tracks">Liste mit Track Objekten</param>
        [OperationContract]
        void FillTracks(List<Track> tracks);

        /// <summary>
        /// Gibt eine Liste mit allen Tracks in der Datenbank zurück, welche noch nicht zugewiesen wurden
        /// </summary>
        /// <returns>Eine Liste mit nicht zugewiesenen Tracks</returns>
        [OperationContract]
        List<Track> ShowUnassignedTracks();

        /// <summary>
        /// Weisste einen Track einer Category zu.
        /// </summary>
        /// <param name="trackId">ID des Tracks</param>
        /// <param name="CategoryId">ID der Category</param>
        [OperationContract]
        void AssignTracks(Guid trackId, Guid CategoryId);

        

        /// <summary>
        /// Speichert eine neu erstellte oder geänderte Kategorie und die dazugehörigen Objekte.
        /// </summary>
        /// <param name="category"></param>
        [OperationContract]
        void SaveCategory(Category category);

        /// <summary>
        /// Löscht eine Category in der Datenbank
        /// </summary>
        /// <param name="categoryId">Die ID der Category, welche gelöscht werden soll</param>
        [OperationContract]
        void DeleteCategory(Guid categoryId);

        /// <summary>
        /// Lädt eine Liste mit Tracks, welche einer Category angehören
        /// </summary>
        /// <param name="id">ID der Category</param>
        /// <returns>Liste mit Track Objekten</returns>
        [OperationContract]
        Category LoadCategory(Guid id); 
    }
}
